<?php
/* *
 * 功能：支付宝页面跳转同步通知页面
 * 版本：3.3
 * 日期：2012-07-23
 * 说明：
 * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。

 *************************页面功能说明*************************
 * 该页面可在本机电脑测试
 * 可放入HTML等美化页面的代码、商户业务逻辑程序代码
 * 该页面可以使用PHP开发工具调试，也可以使用写文本函数logResult，该函数已被默认关闭，见alipay_notify_class.php中的函数verifyReturn
 */

namespace api\controllers;
use Yii;
use leyestd\alipay\Aliconfig;
use Opwechat\Phppayment\CLogFileHandler;
use Opwechat\Phppayment\Log;
use services\models\OrderInfo;
use services\models\Order;
use services\models\PayLog;
use common\helper\UrlManager;
use leyestd\alipay\lib\WapAlipayNotify;


class WapReturnAlipayController extends BaseCoreController
{
    public $alipay_config = '';
    public $path='';
    
    //关闭layout已经安全模式
    public function init() {
        parent::init();
        $this->alipay_config = (new Aliconfig())->getAliconfig();
        $this->path = Yii::$app->params['root_log'];
    }
    public function actionIndex() {
        //初始化日志
        $logHandler= new CLogFileHandler($this->path."/alipay/return_".date('Y-m-d').'.log');
        $log = Log::Init($logHandler, 15);
        //计算得出通知验证结果
        $alipayNotify = new WapAlipayNotify($this->alipay_config);
        $verify_result = $alipayNotify->verifyReturn();

        Log::DEBUG('begin-return');
        if($verify_result)
        {
            $result = Yii::$app->request->get();
            //记录日志
            Log::INFO(json_encode($result));
            
            $out_trade_no = $result['out_trade_no']; //商户订单号
            $trade_no = $result['trade_no']; //支付宝交易号
            $trade_status = $result['result']; //交易状态
             
            if($trade_status == 'success')
            {
                //查询订单信息
                $order_info = OrderInfo::find()->select(['bestry_uid','status','pay_status','order_amount','order_info_id'])->where(['order_sn'=>$out_trade_no])->one();
                if(empty($order_info)) {
                    Log::DEBUG('select order_info:'.$out_trade_no.'查询不到订单信息');
                    exit;
                }
                $flag = false;
                // 如果是已经取消的订单，再支付，只更新支付状态，不更新订单状态
                if(!empty($order_info) && $order_info->status == OrderInfo::$STATUS_ORDER_CANCEL  && $order_info->pay_status == OrderInfo::$PAY_STATUS_WAIT) {
                    //插入日志
                    Log::DEBUG($out_trade_no.'是已取消订单，开始修改支付状态，不修改订单状态');
                    //开始修改订单状态
                    $flag = Order::orderStatusChange($order_info->order_info_id, $order_info->status,OrderInfo::$PAY_STATUS_SUCCESS);
                }
    
                // 如果是待支付状态，更新订单状态，支付状态。
                if(!empty($order_info) &&  $order_info->status  == OrderInfo::$STATUS_ORDER_CREATED && $order_info->pay_status == OrderInfo::$PAY_STATUS_WAIT) {
                     
                    //插入日志
                    Log::DEBUG($out_trade_no.'是待支付订单，开始修改支付状态，修改订单状态');
    
                    $flag = Order::orderStatusChangePayed($order_info->order_info_id);
                }
    
    
                //更新订单成功后插入pay_log记录
                if($flag === true) {
                    //插入支付日志
                    Log::DEBUG($out_trade_no.'开始插入支付pay_log');
                    $this->updatePayLog($order_info->order_info_id,$out_trade_no,$trade_status,$trade_no='','',$bank_seq_no='',$out_channel_type='',$out_channel_inst='');
                }
                
                $url = UrlManager::createUrl(Yii::$app->params['domains']['wap_url'], ['order/payed','order_info_id'=>$order_info->order_info_id]);
            
                 $this->redirect($url);
                
            } else {
                Log::DEBUG("trade_status=".$result['result']);
                echo "trade_status=".$result['result'];
            }
    
        } else
        {
            Log::ERROR('Validation failure');
            echo "verify failed";
    
        }
    }
    
    /**
     * 修改支付pay_log
     * @param int $order_info_id 订单id
     * @param string $out_trade_no 订单号
     * @param unknown $trade_status 支付状态
     * @param unknown $trade_no 支付宝交易流水号
     * @param unknown $notify_time 通知时间
     * @param unknown $bank_seq_no 网银流水号
     * @param unknown $out_channel_type 该笔交易所使用的支付渠道
     * @param unknown $out_channel_inst 实际支付渠道
     */
    private function updatePayLog($order_info_id,$out_trade_no,$trade_status,$trade_no='',$notify_time,$bank_seq_no='',$out_channel_type='',$out_channel_inst=''){
        $model = PayLog::findOne(['order_info_id'=>$order_info_id,'order_sn'=>$out_trade_no]);
        if($model) {
                $model->trade_status   = $trade_status;
                $model->trade_no        = $trade_no;
                $model->notify_time     = $notify_time;
                $model->bank_seq_no     = $bank_seq_no;
                $model->out_channel_type = $out_channel_type;
                $model->out_channel_inst = $out_channel_inst;
                $model->save();
                return true;
        
            }else {
                
                Log::WARN($out_trade_no.'在pay_log表未查询到记录');
        
                return false;
            }
        
    }
}

?>